home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / vmsnet / tank / part02 < prev   
Encoding:
Internet Message Format  |  1992-02-26  |  30.2 KB

  1. Path: uunet!wupost!waikato.ac.nz!ccc_rex
  2. From: ccc_rex@waikato.ac.nz
  3. Newsgroups: vmsnet.sources.games
  4. Subject: TANK 2/2
  5. Message-ID: <1992Feb27.144138.6698@waikato.ac.nz>
  6. Date: 27 Feb 92 14:41:38 +1300
  7. Organization: University of Waikato, Hamilton, New Zealand
  8. Lines: 1037
  9.  
  10. $PART2:
  11. $ create 'f'
  12. X`1B`5BH`1B`5BJ`1B(B`1B`5B0m
  13. X`1B`5B1;1H`1B#3`1B`5B7m  3  `1B`5B0m       MULTI-USER TANK       `1B`5B7m  3
  14. V  `1B`5B2;1H`1B#4  3  `1B`5B0m       MULTI-USER TANK       `1B`5B7m  3 `20
  15. X`1B`5B3;1H`1B#4`1B`5B3;13H`1B`5B0m`1B(0`60`60`60`60`60`60`60`60`60`60`60`60`
  16. V60`60`60`1B`5B5;1H`1B#6  C`1B(Bommands`1B`5B5;27HScoring`1B`5B6;1H`1B#6  `1B
  17. V(0oooooooo`1B`5B6;27Hooooooo
  18. X`1B`5B7;1Hlqqqqqqqwqqqqqqqwqqqqqqqk`1B`5B7;43Hlqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
  19. Vqqqqqqqk`1B`5B8;1Hx       x N`1B(Bo
  20. X`1B`5B8;13Hrth `1B(0x       x   `60    `1B(B- You    `1B(0x `1B(Bo 64 points
  21. V for destroying tank.   `1B(0x
  22. X`1B`5B9;1Hx   7   x   8   x   9   x`1B`5B9;43Hx `1B`5B9;80Hx`1B`5B10;1Hx
  23. V       x       x       x   1`1B(B..8 - Ot
  24. X`1B`5B10;38Hhers `1B(0x `1B(Bo -1 points for firing laser.      `1B(0x`1B`5B
  25. V11;1Htqqqqqqqnqqqqqqqnqqqqqqqu`1B`5B11;43H
  26. X`1B`5B11;43Hx`1B`5B11;80Hx`1B`5B12;1Hx       x L`1B(Baser `1B(0x       x   X
  27. V`1B(B,x  - Mines  `1B(0x `1B(Bo  5 points for
  28. X`1B`5B12;60H destroying mines.  `1B(0x`1B`5B13;1Hx   4   x   5   x   6   x`1
  29. VB`5B13;43Hx`1B`5B13;80Hx
  30. X`1B`5B14;1Hx E`1B(Bast  `1B(0x L`1B(Baser `1B(0x  W`1B(Best `1B(0x   `1B(B+
  31. V    - Shield `1B(0x `1B(Bo  Mines kill immedia
  32. X`1B`5B14;66Htely.`1B`5B14;80H`1B(0x`1B`5B15;1Htqqqqqqqnqqqqqqqnqqqqqqqu  `1B
  33. V`5B15;40H   x      `1B`5B15;80Hx
  34. X`1B`5B16;1Hx       x       x       x   O    `1B(B- Base   `1B(0x `1B(Bo  On
  35. V first phaser hit, shield is  `1B(0x
  36. X`1B`5B17;1Hx   1   x   2   x   3   x `1B`5B17;43Hx    `1B(Blost.Retrieve by
  37. V passing over it`1B(0x
  38. X`1B`5B18;1Hx       x S`1B(Bouth `1B(0x       x   `1B`5B7m           `1B`5B0m
  39. V   x `1B`5B18;80Hx`1B`5B19;1Hmqqqqqqqvqqqqqqqvqq
  40. X`1B`5B19;20Hqqqqqj   `1B`5B7m           `1B`5B0m   x `1B(Bo  Laser charges w
  41. Vith time.        `1B(0x
  42. X`1B`5B20;43Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj`1B`5B21;1Hlqqqqqqqqqqqq M
  43. V`1B(Bessages `1B(0qqqqqqqqqqqqqqqk`20
  44. X`1B`5B21;41H  lqqqqqqqqqqqqq N`1B(Bame `1B(0qqqqqqqqqqqqqqqqqk`1B`5B22;1Hx`1
  45. VB`5B22;39Hx   x     `1B(B*`1B(0`7E `1B`5B22;70H`7E*
  46. X`1B`5B22;72H        x`1B`5B23;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj   mq
  47. Vqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`1B`5B1;1H
  48. X`1B`5B23;76H`1B`5B23;76Hqqqqj`1B`5B1;1H
  49. X`1B*
  50. $ CALL UNPACK TANK.SCN;7 759580851
  51. $ create 'f'
  52. XC
  53. X`09SUBROUTINE`09HELP_SCREEN
  54. XC
  55. X`09PARAMETER ESC = 27
  56. X`09CHARACTER Line*256
  57. X        BYte REP
  58. X`09INTEGER Len_Line,ErrNum
  59. XC
  60. X`09CALL image_dir()
  61. XC
  62. X        Write(5,111)esc
  63. X111     Format(X,A1,'<')
  64. X1`09OPEN(UNIT=4,FILE='IMAGE_DIR:TANK.SCN',ReadOnly,
  65. X`091 STATUS='OLD',IoStat=ErrNum)
  66. X        If (ERRNUM.EQ.30) Goto 50
  67. X        If (ERRNUM.NE.0 ) Goto 999
  68. X100     READ(4,110,END=200) LEN_LINE, LINE(:LEN_LINE)
  69. X110     FORMAT(Q,A)
  70. X        WRITE(5,120) LINE(:LEN_LINE)
  71. X120     FORMAT(1X,A)
  72. X        GOTO 100
  73. X200`09close (unit = 4)
  74. X999`09RETURN
  75. XC
  76. X50`09Write(5,51),Esc,Esc
  77. X51      FORMAT(X,A1,'`5B2J',A1,'`5B1;1HPlease wait...')
  78. X        Call Sleep(4)
  79. X        Goto 1
  80. XC
  81. X        END
  82. $ CALL UNPACK TANKH.FOR;2 656812248
  83. $ create 'f'
  84. X`09.title`09TANKM Tank Game
  85. X
  86. X$$tank = 1`09`09`09; say that this is TANK game
  87. X
  88. X;+
  89. X;`09or`09TANKM`09Tank Game
  90. X;`09if $$TANK is defined
  91. X;-
  92. X
  93. X`09$dibdef
  94. X`09$iodef
  95. X`09$qiodef
  96. X`09$secdef
  97. X`09$jpidef
  98. X;`09$ssdef
  99. Xesc`09`09= 27
  100. X
  101. Xsnake`09`09= 8`09`09; number of snakes
  102. X
  103. X;`09meaning of event flags in cluster 2
  104. X
  105. Xflag$v_master`09= 0`09`09; set if a master snake exists
  106. Xflag$v_read`09= 1`09`09; set if all snakes should read command
  107. Xflag$v_update`09= 2`09`09; set if all snakes should update screen
  108. Xflag$v_game`09= 3`09`09; set if game is in progress
  109. Xflag$v_endofgame= 4`09`09; set if we have reached the end of the game
  110. Xflag$v_synch`09= 5
  111. Xflag$v_done`09= 8`09`09; set if operation (read,update) is complete
  112. X
  113. Xcheck_timer`09= 13`09`09; check timer id
  114. X
  115. X
  116. X`09.psect`09$rodata`09nowrt, noexe, shr, pic, long
  117. X
  118. Xttname_descr:
  119. X`09.ascid`09/TT/
  120. X
  121. Xmbxcnv:
  122. X`09.ascid`09/_MBA!UW:/`09; convert mbx unit number to physical name
  123. X
  124. Xmbxbuf_descr:
  125. X`09.word`09mbxbuf_siz, 0
  126. X`09.long`09mbxbuf
  127. X
  128. Xdibbuf_descr:
  129. X`09.word`09dib$k_length, 0
  130. X`09.long`09dibbuf
  131. X
  132. X`09.align long
  133. Xsnake_desc_2:
  134. X.if ndf $$tank
  135. X`09.ascid`09/SNAKE_1/`09`09; name of snake event flags
  136. X.iff
  137. X`09.ascid`09/TANK_1/
  138. X.endc
  139. X
  140. X`09.align`09long
  141. Xsnake_map_name:
  142. X.if ndf $$tank
  143. X`09.ascid`09/SNAKE_DATA/
  144. X.iff
  145. X`09.ascid`09/TANK_DATA/
  146. X.endc
  147. X
  148. Xtext = .
  149. X`09.ascii`09<esc>'<'`09`09; enter ANSI mode
  150. X`09.ascii`09<esc>'(B'`09`09; select ascii character set
  151. X`09.ascii`09<esc>'`5B2J'`09`09; erase entire screen
  152. X`09.ascii`09<esc>'`5B1;1H'`09`09; jump to top left corner
  153. X`09.ascii`09<10>`09`09`09; linefeed
  154. X.if ndf $$tank
  155. X`09.ascii`09<esc>'#3                 SNAKE' ; double-height top half
  156. X.iff
  157. X`09.ascii`09<esc>'#3                 TANK'
  158. X.endc
  159. X`09.ascii`09<13><10>
  160. X.if ndf $$tank
  161. X`09.ascii`09<esc>'#4                 SNAKE' ; double-height bottom half
  162. X.iff
  163. X`09.ascii`09<esc>'#4                 TANK'
  164. X.endc
  165. X`09.ascii`09<13><10><10>
  166. X`09.ascii`09<esc>'#6        Thank you for playing'
  167. X`09.ascii`09<13><10><10>
  168. Xtext_len = . - text
  169. X`09.align`09long
  170. Xtext_end_game:
  171. X`09.long`092
  172. X`09.long`09text
  173. X`09.address 10$
  174. X10$:`09.long`09text_len
  175. X
  176. Xtext = .
  177. X`09.ascii`09<13><10><10>
  178. X`09.ascii`09'Game aborted because master '
  179. X.if ndf $$tank
  180. X`09.ascii`09'snake'
  181. X.iff
  182. X`09.ascii`09'tank'
  183. X.endc
  184. X`09.ascii`09' quitted'<13><10><10>
  185. Xtext_len = . - text
  186. X`09.align`09long
  187. Xtext_abort:
  188. X`09.long`092
  189. X`09.long`09text
  190. X`09.address 10$
  191. X10$:`09.long`09text_len
  192. X
  193. Xtext = .
  194. X`09.ascii`09<esc> 'Y' <31+24> <31+1>`09; col 1, row 24
  195. X`09.ascii`09<esc> 'G'`09`09`09; exit graphics
  196. X`09.ascii`09<7> ' Please wait for next game ...'
  197. X`09.ascii`09<esc> 'F'`09`09`09; enter graphics
  198. Xtext_len = . - text
  199. X`09.align`09long
  200. Xtext_wait:
  201. X`09.long`092
  202. X`09.long`09text
  203. X`09.address 10$
  204. X10$:`09.long`09text_len
  205. X
  206. X`09.align`09long
  207. Xusername_jpi:
  208. X`09.word`0912, jpi$_username
  209. X`09.address username_buf
  210. X`09.address username_siz
  211. X`09.long`090
  212. X
  213. X`09.align`09long
  214. Xstart_wait:
  215. X`09.long`09-10000000*5, -1`09`09; wait 5 seconds
  216. Xsecond_1:
  217. X`09.long`09-10000000*1, -1`09`09; wait 1 second
  218. Xsecond_2:
  219. X`09.long`09-10000000*2, -1`09`09; wait 2 seconds
  220. Xupdate_wait:
  221. X`09.long`09-100000*33, -1`09`09; wait 33/100 ths of a second
  222. Xcheck_wait:
  223. X`09.long`09-10000000*4, -1`09`09; wait 2 seconds for checking
  224. Xvalid_move:
  225. X`09.long`09`5EB101110100`09`09; valid moves are 2,4,6,8 and 5!!
  226. Xstart_direction:
  227. X.if ndf $$tank
  228. X`09.byte`092, 8, 2, 8, 2, 8, 6, 4`09; initial move directions for snake
  229. X.iff
  230. X`09.byte`096, 4, 4, 6, 2, 8, 6, 4`09;  for tank
  231. X.endc
  232. X`09.align`09long
  233. Xadd_head_par:
  234. X`09.long`091`09`09`09; parameter list to Pascal routine
  235. X`09.address move`09`09`09; each players move
  236. Xupdate_par:
  237. X`09.long`092
  238. X`09.address outbuf
  239. X`09.address screen_len
  240. Xupdate_par2:`09`09`09; if we have died, then there is no head
  241. X`09.long`092`09`09; to change to a diamond, so write screen
  242. X`09.address screen_buf`09; update directly from global memory.
  243. X`09.address screen_len
  244. X
  245. X`09.psect`09$rwbuf`09wrt, noexe, noshr, pic, page
  246. X
  247. Xmbxname_len = 16
  248. Xmbxname:`09`09`09; room to hold the physical mbx name
  249. X`09.blkb`09mbxname_len
  250. Xmbxname_descr:
  251. X`09.word`09mbxname_len, 0
  252. X`09.long`09mbxname
  253. Xmbxiosb:
  254. X`09.long`090,0
  255. Xmbxbuf_siz = 32
  256. Xmbxbuf:
  257. X`09.blkb`09mbxbuf_siz
  258. X
  259. Xdibbuf:
  260. X`09.blkb`09dib$k_length
  261. X
  262. X`09.align`09long
  263. Xttiosb:
  264. X`09.long`090,0
  265. X
  266. Xttbuf_siz = 128
  267. Xttbuf:
  268. X`09.blkb`09ttbuf_siz
  269. X`09.align`09page
  270. Xoutbuf_siz = 512
  271. Xoutbuf::
  272. X`09.blkb`09outbuf_siz
  273. X
  274. Xsnake_fab:
  275. X.if ndf $$tank
  276. X`09$fab`09fnm=<GAMES:SNAKE.BIN>, fop=<ufo>,-
  277. X`09`09fac=<get,put>, shr=<get,upd,upi>
  278. X.iff
  279. X`09$fab`09fnm=<GAMES:TANK.BIN>, fop=<ufo>,-
  280. X`09`09fac=<get,put>, shr=<get,upd,upi>
  281. X.endc
  282. Xmap_range:
  283. X`09.address share_data
  284. X`09.address share_data+<512*3>
  285. Xret_range:
  286. X`09.long`090, 0
  287. X
  288. X
  289. X`09.psect`09$sharedata wrt, noexe, shr, pic, page
  290. Xshare_data:
  291. X
  292. Xgame_count:
  293. X`09.long`09`09`09; count of number of games played
  294. Xmaster_flag:
  295. X`09.long`09`09`09; = 1 if we are master snake
  296. Xabort:
  297. X`09.long`09`09`09; = 1 if all snakes should abort
  298. Xplayer_bits:
  299. X`09.long`09`09`09; bit set if that snake is playing
  300. Xplayers:
  301. X`09.long`09`09`09; bit set if that snake is reserved
  302. Xother_players:
  303. X`09.long`09`09`09; used by master snake to wait for other
  304. X`09`09`09`09; snakes to indicate operation completed
  305. Xmove_count:
  306. X`09.long`09`09`09; incremented every move.  Used for detecting
  307. X`09`09`09`09; other snakes hanging the game
  308. Xgame_going:
  309. X`09.long`09`09`09; <> 0 if a game is going
  310. Xyou_just_died:
  311. X`09.long`09`09`09; bit I set if snake I just died
  312. Xseed:
  313. X`09.long`09`09`09; random number seed
  314. Xstart_position:
  315. X`09.blkl`09snake`09`09; position of starting (1-8)
  316. X;
  317. X;`09`095
  318. X;    1`09+---------------+  3
  319. X;`09`7C`09`09`7C
  320. X;`09`7C`09`09`7C
  321. X;    7`09`7C`09`09`7C  8
  322. X;`09`7C`09`09`7C
  323. X;`09`7C`09`09`7C
  324. X;    4`09+---------------+  2
  325. X;`09`096
  326. X;
  327. Xscore:
  328. X`09.blkl`09snake`09`09; players' score
  329. Xn_games:
  330. X`09.blkl`09snake`09`09; # of games each player has played
  331. Xwins:
  332. X`09.blkl`09snake`09`09; # of wins for each player
  333. Xplayer_pos:
  334. X`09.blkl`09snake`09`09; starting position of each snake
  335. X`09.align`09quad
  336. Xmove:
  337. X`09.blkb`09snake`09`09; each snakes move
  338. Xname_size = 32
  339. Xname:
  340. X`09.blkb`09name_size * snake ; each snakes name (32 chars long)
  341. X. = . + 512 - < . - share_data >
  342. X`09.align`09long
  343. Xscreen_len:
  344. X`09.long`09`09`09; # chars to be output
  345. Xscreen_buf:
  346. X`09.blkb`09508`09`09; buffer containing screen update
  347. X. = . + <512*4> - < . - share_data >
  348. X
  349. X
  350. X`09.psect`09$rwdata`09wrt, noexe, noshr, pic, long
  351. X
  352. Xttchan:
  353. X`09.word
  354. Xmbxchan:
  355. X`09.word
  356. Xdata_ready:
  357. X`09.word
  358. Xmaster:
  359. X`09.word`09`09`09; = 1 if we are master snake
  360. Xcontrol_c_flag:
  361. X`09.word`09`09`09; non zero if `5EC typed
  362. Xdead:
  363. X`09.word`09`09`09; bit I set if snake I just died
  364. X`09.align`09long
  365. Xcluster_2:
  366. X`09.long
  367. Xcluster_3:
  368. X`09.long
  369. Xplayer:
  370. X`09.long
  371. Xplayer_efn:`09`09`09; my player efn in cluster 2
  372. X`09.long
  373. Xcurrent_players:
  374. X`09.long
  375. Xchars_left:`09`09`09; # of chars left in buffer
  376. X`09.long
  377. Xchar_pointer:
  378. X`09.long`09`09`09; address of next character
  379. Xlast_move_count:
  380. X`09.long
  381. Xusername_buf:
  382. X`09.blkb`0912
  383. Xusername_siz:
  384. X`09.long
  385. X
  386. Xoutbuf_qio:
  387. X`09$qio`09func=io$_writevblk!io$m_noformat,-
  388. X`09`09p1=outbuf
  389. Xoutput_qio:
  390. X`09$qio`09func=io$_writevblk!io$m_noformat
  391. X
  392. Xread_qio:
  393. X`09$qio`09func=io$_readvblk!io$m_timed!io$m_noecho!io$m_nofiltr,-
  394. X`09`09iosb=ttiosb,-
  395. X`09`09p1=ttbuf, p2=ttbuf_siz, p3=0`09; wait time = 0
  396. X
  397. Xexit_block:`09`09`09; exit handler block
  398. X`09.long
  399. X`09.address snake_exit
  400. X`09.long`091`09`09; 1 argument
  401. X`09.address 10$
  402. X10$:`09.long`09`09`09; exit reason
  403. X
  404. X
  405. X`09.psect`09$code`09nowrt, exe, shr, pic
  406. X
  407. X`09.entry`09-
  408. XTTINIT, `5Em<>
  409. X;+
  410. X; Create a mailbox.  Assign a channel to terminal with an associated mailbox
  411. V.
  412. X;-
  413. X`09$crembx_s`09chan=mbxchan, promsk=#`5ExFF00
  414. X`09bsbw`09`09error
  415. X`09$getchn_s`09chan=mbxchan, pribuf=dibbuf_descr
  416. X`09bsbw`09`09error
  417. X`09$fao_s`09`09ctrstr=mbxcnv, outbuf=mbxname_descr,-
  418. X`09`09`09outlen=mbxname_descr, p1=dibbuf+dib$w_unit
  419. X`09$assign_s`09devnam=ttname_descr, chan=ttchan, acmode=#`5ExFF00,-
  420. X`09`09`09mbxnam=mbxname_descr
  421. X`09blbc`09r0, 100$
  422. X`09movw`09ttchan, outbuf_qio+qio$_chan`09`09;store channel #
  423. X`09movw`09ttchan, output_qio+qio$_chan`09`09;store channel #
  424. X`09movw`09ttchan, read_qio+qio$_chan`09`09;store channel #
  425. X`09$qiow_s`09func=#io$_setmode!io$m_ctrlcast, chan=ttchan,-
  426. X`09`09p1=control_c
  427. X`09ret
  428. X100$:
  429. X`09bsbw`09error
  430. X`09ret
  431. X
  432. X`09.entry`09-
  433. XTT1CHAR,`09`5Em<>
  434. X`09clrb`09ttbuf
  435. X`09$qiow_s`09func=#io$_readvblk!io$m_timed!io$m_noecho!io$m_nofiltr,-
  436. X`09`09chan=ttchan, iosb=ttiosb,-
  437. X`09`09p1=ttbuf, p2=#1, p3=#0`09; wait time = 0
  438. X`09cvtbl`09ttbuf, r0
  439. X`09cmpb`09r0, #13`09`09`09; is it <CR> ?
  440. X`09bneq`09100$
  441. X`09clrb`09data_ready
  442. X100$:`09ret
  443. X
  444. XTTREAD::
  445. X`09blbs`09control_c_flag, 10$
  446. X`09tstl`09chars_left`09`09; have we used all characters ?
  447. X`09bgtr`0950$`09`09`09; no --> 50$
  448. X`09bbsc`09#0, data_ready, 20$`09; check if input ready
  449. X5$:`09mnegl`09#1, r0`09`09`09; no characters read
  450. X`09rsb`09`09`09`09; no
  451. X10$:
  452. X`09clrl`09r0`09`09`09; on `5EC return move 0 = quit
  453. X`09rsb
  454. X20$:
  455. X`09$qiow_g read_qio
  456. X`09blbc`09r0, 5$`09`09`09; error
  457. X;
  458. X;`09$qiow_s`09func=#io$_writevblk,chan=ttchan,-`09; debug write
  459. X;`09`09p1=ttbuf, p2=ttiosb+2, p4=#`5Ex1000
  460. X
  461. X`09movzwl`09ttiosb+2, chars_left`09`09; # chars read
  462. X`09movab`09ttbuf, char_pointer`09`09; store address of character
  463. X50$:
  464. X`09decl`09chars_left
  465. X`09movzbl`09@char_pointer, r0`09`09; get next char
  466. X`09incl`09char_pointer`09`09`09; point to next
  467. X`09subb2`09#`5EA/0/, r0`09`09`09; convert from ascii to binary
  468. X`09blss`09200$`09`09`09`09; invalid command
  469. X`09cmpb`09r0, #9
  470. X`09bgeq`09150$`09`09`09`09; invalid command (maybe quit)
  471. X`09bbc`09r0, valid_move, 200$`09`09; invalid command
  472. X.if df $$tank
  473. X`09tstl`09chars_left`09`09`09; any chars left ?
  474. X`09bleq`09100$`09`09`09`09; no --> 100$
  475. X`09cmpb`09@char_pointer, #`5EA/5/`09`09; is next command fire ?
  476. X`09bneq`09100$`09`09`09`09; no --> 100$
  477. X`09incl`09char_pointer
  478. X`09decl`09chars_left
  479. X`09bisb2`09#`5EB10000, r0`09`09`09; add 16 to indicate fire
  480. X.endc
  481. X100$:
  482. X`09rsb
  483. X150$:
  484. X`09cmpb`09r0, #`5EA/e/-`5EA/0/`09`09; was an "e" typed ?
  485. X`09beql`09180$
  486. X`09cmpb`09r0, #`5EA/E/-`5EA/0/`09`09; was an "E" type ?
  487. X`09bneq`09200$
  488. X180$:
  489. X`09clrl`09r0`09`09`09`09; quit is move = 0
  490. X`09rsb
  491. X200$:
  492. X`09mnegl`09#1, r0`09`09`09`09; no move given
  493. X`09rsb
  494. X
  495. X`09.entry`09-
  496. XMBXREAD,`09`5Em<>
  497. X;+
  498. X; This is an AST routine which executes when the mailbox record has been rea
  499. Vd.
  500. X; The record itself is a status message which is assumed to say that
  501. X; unsolicited data is available at the terminal
  502. X;-
  503. X`09blbc`09mbxiosb, 100$`09`09; on error, dont re-que read
  504. X;`09we could have SS$_CANCEL or SS$_ABORT from the $CANCEL in the
  505. X;`09exit handler
  506. X`09movb`09#1, data_ready`09`09; indicate data is there
  507. X`09bsbw`09queue_mbxread`09`09; queue another read request
  508. X100$:
  509. X`09ret
  510. X
  511. XQUEUE_MBXREAD:
  512. X`09$qio_s`09efn=#2, func=#io$_readvblk, chan=mbxchan, iosb=mbxiosb,-
  513. X`09`09astadr=mbxread,-
  514. X`09`09p1=mbxbuf, p2=#mbxbuf_siz
  515. X`09blbc`09r0, 100$
  516. X`09rsb
  517. X100$:
  518. X`09bsbw`09error
  519. X`09rsb
  520. X
  521. XTTWRITE::
  522. X;+
  523. X;`09bsbw`09ttwrite
  524. X;`09r3 contains length of buffer to write
  525. X;`09the buffer is outbuf
  526. X;-
  527. X`09movl`09r3, outbuf_qio+qio$_p2`09`09; store length of buffer
  528. X`09$qiow_g`09outbuf_qio
  529. X`09blbc`09r0, 100$
  530. X`09rsb
  531. X100$:
  532. X`09bsbw`09error
  533. X`09rsb
  534. X
  535. X
  536. X`09.entry`09-
  537. Xsnake_screen, `5Em<r2,r3,r4,r5>
  538. X;+
  539. X;`09CALL SNAKE_SCREEN( array, length )
  540. X;`09BYTE ARRAY( LENGTH )
  541. X;`09copies string to update screen into shared memory
  542. X;-
  543. X`09movl`09@8(ap), r0`09`09; get length
  544. X`09movl`09r0, screen_len`09`09; store length
  545. X`09movc3`09r0, @4(ap), screen_buf`09; copy text
  546. X`09ret
  547. X
  548. X`09.entry`09-
  549. Xsnake_write, `5Em<>
  550. X;+
  551. X;`09CALL SNAKE_WRITE( array, length )
  552. X;`09BYTE ARRAY( LENGTH )
  553. X;`09writes buffer to terminal in noformat mode
  554. X;-
  555. X`09movl`094(ap), output_qio+qio$_p1`09; store address of buffer
  556. X`09movl`09@8(ap), output_qio+qio$_p2`09; store length of buffer
  557. X`09$qiow_g`09output_qio
  558. X`09blbc`09r0, 100$
  559. X`09ret
  560. X100$:
  561. X`09bsbw`09error
  562. X`09ret
  563. X
  564. X`09.entry`09-
  565. Xsnake_dead, `5Em<>
  566. X;+
  567. X;`09CALL SNAKE_DEAD( player # )
  568. X;-
  569. X`09subl3`09#1, @4(ap), r0`09`09`09; get # of snake who died
  570. X`09bbss`09r0, you_just_died, 100$`09`09; set flag saying he died
  571. X100$:`09ret
  572. X
  573. X
  574. X`09.entry -
  575. XCANCELTYPEAHEAD, `5Em<>
  576. X`09clrl`09r0
  577. X`09tstw`09ttchan`09`09; check channel is open
  578. X`09beql`09100$
  579. X`09$qiow_s`09func=#io$_readvblk!io$m_purge!io$m_timed,-
  580. X`09`09chan=ttchan, p1=ttbuf`09; do read with 0 length buffer (p2)
  581. X100$:`09ret`09`09`09; return with status in r0
  582. X
  583. XERROR:
  584. X`09blbs`09r0, 100$
  585. X`09pushl`09r0
  586. X`09calls`09#1, G`5Elib$signal
  587. X100$:
  588. X`09rsb
  589. X
  590. X`09.entry`09-
  591. Xcontrol_c, `5Em<>
  592. X`09movb`09#1, control_c_flag
  593. X`09ret
  594. X
  595. X
  596. X`09.page
  597. X`09.entry`09-
  598. XSNAKE_INIT, `5Em<r2,r3,r4,r5>`09`09`09`09; snake game
  599. X;+
  600. X;`09I = SNAKE_INIT( player # , game )
  601. X;`09returns I = 1 if you are master snake.
  602. X;`09returns your player # as a integer
  603. X;`09returns game = 1 if there is a game in progress
  604. X;-
  605. X
  606. X`09calls`09#0, G`5Ettinit`09`09`09; open terminal
  607. X;
  608. X`09$ascefc_s efn=#64, name=snake_desc_2`09; associate event flag cluster
  609. X`09bsbw`09error
  610. X;
  611. X;`09$open`09fab=snake_fab`09`09`09; open section file
  612. X;`09bsbw`09error
  613. X
  614. X`09$deltva_s inadr=map_range`09`09; delete memory were global
  615. X`09bsbw`09error`09`09`09`09;  memory will be mapped
  616. X
  617. X`09$crmpsc_s inadr=map_range, flags=#sec$m_gbl!sec$m_wrt!sec$m_pagfil, -
  618. X`09`09gsdnam=snake_map_name, -`09; chan=snake_fab+fab$l_stv,-
  619. X`09`09pagcnt=#4
  620. X`09bsbw`09error
  621. X
  622. X`09cmpl`09r0, #ss$_created`09`09; are we first to map section
  623. X`09bneq`0950$`09`09`09`09; no
  624. X`09movab`09share_data+4, r3
  625. X`09movc5`09#0, (r3), #0, #512-4, (r3)`09; clear everything except count
  626. X`09$clref_s efn=#flag$v_game+64`09`09; say not game
  627. X`09movl`09#39814571, seed`09`09`09; init random n.g. seed
  628. X`09movl`09#snake, r0`09`09`09; 8 snakes
  629. X20$:
  630. X`09movl`09r0, start_position-4`5Br0`5D`09; init start position
  631. X`09sobgtr`09r0, 20$
  632. X50$:
  633. X`09blbc`09abort, 60$`09`09`09; if not abort --> 60$
  634. X`09callg`09text_abort, snake_write
  635. X`09$exit_s #1
  636. X60$:
  637. X`09bsbw`09queue_mbxread`09`09`09; start terminal read
  638. X;
  639. X`09bbss`09#0, master_flag, 100$`09`09; see if a master snake exists
  640. X`09`09`09; this should be interlocked on a multi-processor
  641. X;+
  642. X; We will have to be the master snake
  643. X;-
  644. X`09movb`09#1, master`09`09`09; indicate we are master snake
  645. X`09$setef_s efn=#7`09`09`09`09; set for first call
  646. X100$:
  647. X;
  648. X`09clrl`09r1`09`09`09`09; start at player 0 (bit0=1)
  649. X150$:
  650. X`09bbcs`09r1, players, 200$`09`09; see if this snake is free
  651. X`09incl`09r1`09`09`09`09; go to next snake
  652. X`09cmpl`09r1, #snake`09`09`09; have we checked all snakes?
  653. X`09blss`09150$`09`09`09`09; no --> 150$
  654. X`09mnegl`09#1, r1`09`09`09`09; player = -1 means none
  655. X200$:
  656. X`09movl`09r1, player`09`09`09; store my snake number (0-7)
  657. X`09movl`09player, @4(ap)`09`09`09;  and return it
  658. X500$:
  659. X`09movzbl`09game_going, @8(ap)`09`09; return game going flag
  660. X
  661. X`09movl`09r1, r3
  662. X`09$getjpi_s itmlst=username_jpi`09`09; get our username
  663. X`09mull2`09#name_size, r3`09`09`09; get offset to start of name
  664. X`09blss`09600$`09`09`09`09; no snakes available
  665. X`09movc5`09username_siz, username_buf, #`5Ea/ /, #name_size, name(r3)
  666. X`09`09`09`09`09`09; copy username
  667. X600$:
  668. X`09$dclexh_s desblk=exit_block`09`09; declare exit handler
  669. X`09bsbw`09error
  670. X
  671. X`09movzbl`09master, r0`09`09`09; return master snake status
  672. X`09ret
  673. X
  674. Xmaster_wait:
  675. X;+
  676. X; master snake has to wait some time for other snakes to start playing
  677. X; called from SNAKE_START
  678. X;-
  679. X`09incl`09game_count`09`09`09; say another game being played
  680. X220$:`09clrb`09player_bits`09`09`09; no other players
  681. X`09bbss`09player, player_bits, 400$`09; say I am playing
  682. X400$:
  683. X`09$clref_s efn=#flag$v_synch+64
  684. X;+
  685. X;`09randomise starting positions
  686. X;-
  687. X`09moval`09start_position, r4`09`09; starting position numbers
  688. X`09movl`09#1, r2`09`09`09`09; snake index (start at 1)
  689. X500$:
  690. X`09pushal`09seed`09`09`09`09; random number seed
  691. X`09calls`09#1, G`5Emth$random`09`09; random real in r0
  692. X`09addl3`09#1, r2, r3`09`09`09; snake + 1
  693. X`09cvtlf`09r3, r3`09`09`09`09; as real
  694. X`09mulf2`09r3, r0`09`09`09`09; get snake to change pos with
  695. X`09cvtfl`09r0, r0
  696. X`09movl`09(r4)`5Br0`5D, r1`09`09`09; swap these positions
  697. X`09movl`09(r4)`5Br2`5D, (r4)`5Br0`5D
  698. X`09movl`09r1, (r4)`5Br2`5D
  699. X`09aobleq`09#7, r2, 500$
  700. X;
  701. X;`09moval`09start_position, r4
  702. X`09movab`09move, r3
  703. X`09movl`09#snake, r2`09`09`09; number of snakes
  704. X600$:
  705. X`09movl`09(r4)+, r0`09`09`09; get start position (1-8)
  706. X`09movb`09start_direction-1`5Br0`5D, (r3)+`09; copy start direction
  707. X`09sobgtr`09r2, 600$
  708. X;
  709. X`09$setimr_s efn=#flag$v_game+64,-`20
  710. X`09`09`09daytim=second_1`09`09; wait a time for other snakes
  711. X`09$waitfr_s efn=#flag$v_game+64`09`09; say that a game is going
  712. X`09movb`09#1, game_going`09`09`09; say game going
  713. X`09$clref_s efn=#flag$v_endofgame+64`09; say not end of game
  714. X`09$setef_s efn=#7`09`09`09`09; sets event flag for first
  715. X`09`09`09`09`09`09;  call to snake_wait
  716. X`09$setimr_s efn=#flag$v_synch+64,-`09`09
  717. X`09`09`09 daytim=start_wait
  718. X`09$waitfr_s efn=#flag$v_synch+64
  719. X`09; this allows other snakes to set bit saying they are playing
  720. X
  721. X`09rsb
  722. X
  723. X`09.entry`09-
  724. XSNAKE_START, `5Em<r2,r3,r4>
  725. X;+
  726. X;`09CALL SNAKE_START( PLAYERS , START_POSITION )
  727. X;`09INTEGER PLAYERS, START_POSITION(8)
  728. X;`09waits 5? seconds for other players to run game
  729. X;`09The master snake is assumed to have waited some additional time
  730. X;`09Returns PLAYERS, bit I <> 0 if that player is active
  731. X;`09START_POSITION(I) is the starting location of snake I, (1-8)
  732. X;-
  733. X`09blbc`09master, 500$`09`09`09; are we master snake ?
  734. X`09bsbw`09master_wait
  735. X`09brb`09800$
  736. X200$:
  737. X`09$exit_s #1`09`09`09`09; game aborted so stop
  738. X500$:
  739. X`09$waitfr_s efn=#flag$v_game+64`09`09; wait until a game starts
  740. X`09blbs`09abort, 200$`09`09`09; if game stopped --> 200$
  741. X`09bbss`09player, player_bits, 600$`09; say I am playing
  742. X600$:`09$waitfr_s efn=#flag$v_synch+64`09`09; synchronise
  743. X`09blbs`09abort, 200$`09`09`09; if game stopped --> 200$
  744. X800$:
  745. X`09movzbl`09player_bits, r4`09`09`09; get player bits
  746. X`09ashl`09#flag$v_done, r4, other_players ; used by master snake
  747. X`09movl`09r4, @4(ap)`09`09`09; store player bits
  748. X`09clrl`09chars_left`09`09`09; cancel type ahead
  749. X`09clrb`09data_ready`09`09`09; make us do a read
  750. X`09$qiow_g read_qio`09`09`09; clear out type-ahead
  751. X;`09return starting positions
  752. X`09moval`09start_position, r0`09`09; address of new positions
  753. X`09movl`098(ap), r2`09`09`09; address of where to put them
  754. X`09movl`09#snake, r1`09`09`09; number of snakes
  755. X900$:
  756. X`09movl`09(r0)+, (r2)+
  757. X`09sobgtr`09r1, 900$
  758. X
  759. X`09mnegl`09#1, last_move_count`09`09; invalidate last counter
  760. X
  761. X`09ret
  762. X
  763. X
  764. XSNAKE_WAIT::
  765. X;+
  766. X;`09BSBW SNAKE_WAIT
  767. X; `09wait until we are told to read players command(s)
  768. X;-
  769. X`09blbs`09master, 200$`09`09`09; are we master snake ?
  770. X`09$waitfr_s efn=#flag$v_read+64`09`09; if not then wait for flag
  771. X`09rsb
  772. X200$:`09; master snake waits and then sets flag for all players
  773. X`09$cantim_s reqidt=#check_timer`09`09; cancel checking timer
  774. X`09$waitfr_s efn=#7`09`09`09; wait for previous timer
  775. X`09$setimr_s efn=#8, daytim=check_wait, -
  776. X`09`09astadr=check_ast, reqidt=#check_timer ; set off checking timer
  777. X`09$setimr_s efn=#7, daytim=update_wait
  778. X`09$clref_s efn=#flag$v_update+64`09`09; clear next flag to wait on
  779. X`09movl`09#flag$v_done+64, r2`09`09; clear each players done flag
  780. X`09$clref_s efn=r2`09`09`09`09; player 0
  781. X`09incl`09r2
  782. X`09$clref_s efn=r2
  783. X`09incl`09r2
  784. X`09$clref_s efn=r2
  785. X`09incl`09r2
  786. X`09$clref_s efn=r2
  787. X`09incl`09r2
  788. X`09$clref_s efn=r2
  789. X`09incl`09r2
  790. X`09$clref_s efn=r2
  791. X`09incl`09r2
  792. X`09$clref_s efn=r2
  793. X`09incl`09r2
  794. X`09$clref_s efn=r2`09`09`09`09; player 7
  795. X;
  796. X`09$clref_s efn=#flag$v_synch+64
  797. X`09$setef_s efn=#flag$v_read+64`09`09; tell everybody to do read
  798. X`09rsb
  799. X
  800. X
  801. XSNAKE_READ::
  802. X;+
  803. X;`09BSBW SNAKE_READ
  804. X;`09read all users moves and store them into the byte array MOVES(*)
  805. X;-
  806. X`09bsbw`09ttread`09`09`09`09; read users commands, if any
  807. X`09tstb`09r0`09`09`09`09; anything read ?
  808. X`09blss`09800$`09`09`09`09; no
  809. X500$:
  810. X`09movl`09player, r1`09`09`09; get our player number
  811. X`09movb`09r0, move(r1)`09`09`09; store our move
  812. X`09bneq`09800$`09`09`09`09; if not quit --> 800$
  813. X`09clrl`09score`5Br1`5D`09`09`09; clear score
  814. X`09clrl`09n_games`5Br1`5D
  815. X`09clrl`09wins`5Br1`5D
  816. X`09$exit_s #1`09`09`09`09; and exit program
  817. X800$:
  818. X`09addl3`09#flag$v_done+64, player, r1
  819. X`09$setef_s efn=r1`09`09`09`09; say that read is complete
  820. X900$:
  821. X`09blbc`09master, 1000$
  822. X`09$wfland_s efn=#64, mask=other_players`09; wait for all players to read
  823. X`09incl`09move_count`09`09`09; onto next move
  824. X`09$clref_s efn=#flag$v_read+64`09`09; clear next flag to wait on
  825. X`09$setef_s efn=#flag$v_update+64`09`09; tell everybody to update
  826. X`09brb`091050$
  827. X1000$:
  828. X`09$waitfr_s efn=#flag$v_update+64`09`09; wait for all reads to complete
  829. X`09blbs`09master_flag, 1050$`09`09; check for master snake OK
  830. X`09movl`09player, r1`09`09`09; get our player number
  831. X`09clrb`09move(r1)`09`09`09; store our move ( quit )
  832. X1050$:
  833. X`09rsb
  834. X
  835. X
  836. X`09.entry`09-
  837. XSNAKE_PLAY, `5Em<r2,r3,r4,r5,r6,r7,r8,r9,r10,r11>
  838. X;+
  839. X;`09called once at the start of the game.
  840. X;`09I then call the Pascal routine ADD_HEAD to perform the moves.
  841. X;-
  842. X`09blbs`09master, 1000$`09`09; master snake does all the work
  843. X100$:
  844. X`09bsbw`09snake_wait
  845. X`09bsbw`09snake_read
  846. X`09$waitfr_s efn=#flag$v_synch+64`09; wait until screen update there
  847. X`09bsbw`09snake_update`09`09; update screen
  848. X`09brb`09100$
  849. X
  850. X900$:
  851. X`09clrb`09game_going`09`09; tell other snakes games finished
  852. X`09$setef_s efn=#flag$v_synch+64`09; wake other snakes up
  853. X`09bsbb`09snake_update`09`09; write out last move
  854. X`09ret
  855. X
  856. X1000$:`09; master snake moves every snake
  857. X`09bsbw`09snake_wait
  858. X`09bsbw`09snake_read
  859. X`09callg`09add_head_par, G`5Eadd_head`09; call Pascal routine
  860. X`09`09`09`09`09`09; returns 1 if game still going
  861. X`09blbc`09r0, 900$`09`09; game has ended --> 900$
  862. X`09$setef_s efn=#flag$v_synch+64`09; wake other snakes up
  863. X`09bsbb`09snake_update`09`09; update our screen
  864. X`09brb`091000$
  865. X
  866. X
  867. X`09.enable local_block
  868. X500$:
  869. X`09$exit_s #1`09`09`09; game aborted, so exit image
  870. X
  871. Xsnake_update::
  872. X`09blbs`09abort, 500$
  873. X`09blbs`09dead, 80$`09`09; if we are dead, then no head
  874. X;`09replace your snake head with a diamond symbol
  875. X`09movc3`09screen_len, screen_buf, outbuf`09; copy update string
  876. X`09movl`09player, r2`09`09; get my snake number
  877. X`09addw2`09#`5EA/1/+`5EX80, r2`09`09; get number with parity bit set
  878. X`09locc`09r2, screen_len, outbuf
  879. X`09beql`0950$`09`09`09; could not find it !!!
  880. X`09movb`09#`5EA/`60/, (r1)`09`09; change to diamond
  881. X50$:
  882. X`09callg`09update_par, snake_write
  883. X`09blbc`09game_going, 100$`09; bit clear if game has finished
  884. X`09bbsc`09player, you_just_died, 60$ ; see if we just died
  885. X`09rsb
  886. X60$:`09movb`09#1, dead`09`09; say we are dead
  887. X`09callg`09text_wait, snake_write`09; tell them to wait for next game_exit,
  888. X`09rsb
  889. X80$:`09; dont copy buffer if no head to update because we are dead
  890. X`09callg`09update_par2, snake_write
  891. X`09blbc`09game_going, 100$
  892. X`09rsb
  893. X100$:
  894. X`09$setimr_s efn=#6, daytim=second_1`09; so we can see last move
  895. X`09$waitfr_s efn=#6
  896. X`09ret`09`09`09`09; return from SNAKE_PLAY if end game
  897. X`09.disable local_block
  898. X
  899. X
  900. X`09.entry`09-
  901. XCHECK_AST, `5Em<r2,r3,r4>
  902. X;+
  903. X;`09called when check_timer expires (2 seconds)
  904. X;`09we should only get here if one of the other snakes has aborted
  905. X;`09or `5ES ed  .  Force the snake out of the game.
  906. X;-
  907. X`09$readef_s efn=#64, state=cluster_2`09; get done flags
  908. X`09extzv`09#flag$v_done, #snake, cluster_2, r2 ; get done flags
  909. X;`09movb`09other_players+1, r3`09`09; get other players
  910. X`09bicw3`09r2, other_players+1, r3`09`09; find players who have not
  911. X`09`09`09`09`09`09; responded
  912. X`09bicw2`09r3, other_players+1`09`09; and say they are dead
  913. X`09clrl`09r2`09`09`09`09; snake 0
  914. X100$:`09bbc`09r2, r3, 200$
  915. X`09clrb`09move(r2)`09`09`09; say snake has quitted
  916. X`09addl3`09#flag$v_done+64, r2, r0`09`09; get event flag
  917. X`09$setef_s efn=r0`09`09`09`09; set event flag so I will
  918. X`09`09`09`09`09`09; wake up on return from here
  919. X200$:`09aoblss`09#snake, r2, 100$`09`09; for all 8 snakes
  920. X
  921. X`09ret
  922. X
  923. X
  924. X`09.entry`09-
  925. XSNAKE_GAME_END, `5Em<>
  926. X;+
  927. X;`09synchronizes the end of the game
  928. X;-
  929. X`09clrb`09dead`09`09`09; we are not dead
  930. X`09blbc`09master, 500$`09`09; if not master snake --> 500$
  931. X`09$clref_s efn=#flag$v_game+64`09; say game not in progress
  932. X`09clrb`09game_going`09`09; and again
  933. X`09$setimr_s efn=#flag$v_endofgame+64, daytim=second_2
  934. X`09clrw`09you_just_died`09`09; reset died flags
  935. X500$:
  936. X`09$waitfr_s efn=#flag$v_endofgame+64 ; wait for end of game
  937. X`09blbs`09abort, 800$`09`09; if we should abort --> 800$
  938. X`09ret
  939. X800$:`09; we must abort. Probably because master snake stopped
  940. X`09$exit_s #1
  941. X
  942. X
  943. X`09.entry`09-
  944. XSNAKE_EXIT, `5Em<r2,r3,r4,r5>
  945. X;+
  946. X;`09called as an exit handler
  947. X;-
  948. X`09$cancel_s chan=mbxchan`09`09; cancel mailbox read
  949. X
  950. X`09movl`09player, r3`09`09; get my snake number
  951. X`09blss`0980$`09`09`09; we never were playing
  952. X`09clrb`09move(r3)`09`09; make next move a quit
  953. X`09addl3`09#flag$v_done, r3, r2`09; get done bit
  954. X`09bbcc`09r2, other_players, 50$`09; stop master snake from waiting for me
  955. X50$:`09addl2`09#64, r2`09`09`09; make into event flag
  956. X`09$setef_s efn=r2`09`09`09; say input done
  957. X`09bbcc`09r3, players, 60$`09; say this snake available
  958. X60$:
  959. X`09clrl`09score`5Br3`5D`09`09; zero score
  960. X`09clrl`09n_games`5Br3`5D`09`09; zero # of games played
  961. X80$:
  962. X`09blbc`09master, 100$`09`09; are we master snake ?
  963. X`09movb`09#1, abort`09`09; tell all other snakes to abort
  964. X`09clrb`09master_flag`09`09; say no master snake
  965. X`09$setef_s efn=#flag$v_read+64`09; wake everybody up
  966. X`09$setef_s efn=#flag$v_update+64
  967. X`09$setef_s efn=#flag$v_endofgame+64
  968. X`09$setef_s efn=#flag$v_synch+64
  969. X`09$setef_s efn=#flag$v_game+64`09; for people waiting for a game
  970. X100$:
  971. X;`09clear screen and put out of graphics mode
  972. X`09callg`09text_end_game, snake_write
  973. X`09blbc`09abort, 200$`09`09; game is not being aborted --> 200$
  974. X`09callg`09text_abort, snake_write
  975. X200$:
  976. X`09$deltva_s inadr=ret_range`09; delete global section
  977. X`09$dassgn_s chan=snake_fab+fab$l_stv ; deassign channel
  978. X
  979. X`09ret
  980. X
  981. X`09
  982. X`09.entry`09-
  983. XNAME_SET, `5Em<r2,r3,r4,r5>
  984. X;+
  985. X;`09CALL NAME_SET( name )
  986. X;`09set this players name
  987. X;-
  988. X`09mull3`09#name_size, player, r3`09; get our player number (0-7)
  989. X`09addl2`09#13, r3`09`09`09; skip username
  990. X`09movc3`09#name_size-13, @4(ap), name(r3) ; store name in shared memory
  991. X`09ret
  992. X
  993. X`09.entry`09-
  994. XNAME_GET, `5Em<r2,r3,r4,r5>
  995. X;+
  996. X;`09CALL NAME_GET( name , player # )
  997. X;`09returns the name of specified player (1-8)
  998. X;-
  999. X`09subl3`09#1, @8(ap), r1`09`09; get player number (0-7)
  1000. X`09mull2`09#name_size, r1`09`09; offset to this players name
  1001. X`09movc3`09#name_size, name(r1), @4(ap) ; return players name
  1002. X`09ret
  1003. X
  1004. X`09.entry`09-
  1005. XSCORE_SET, `5Em<>
  1006. X;+
  1007. X;`09CALL SCORE_SET( player #, score , # games , # wins )
  1008. X;-
  1009. Xplayer_arg = 4
  1010. Xscore_arg = 8
  1011. Xgames_arg = 12
  1012. Xwins_arg = 16
  1013. X`09subl3`09#1, @player_arg(ap), r1`09`09; get our player # (0-snake)
  1014. X`09movl`09@score_arg(ap), score`5Br1`5D`09; store score
  1015. X`09movl`09@games_arg(ap), n_games`5Br1`5D
  1016. X`09movl`09@wins_arg(ap), wins`5Br1`5D
  1017. X`09ret
  1018. X
  1019. X`09.entry`09-
  1020. XSCORE_GET, `5Em<>
  1021. X;+
  1022. X;`09CALL SCORE_GET( player , score , # games , # wins )
  1023. X;-
  1024. X;player_arg = 4
  1025. X;score_arg = 8
  1026. X;games_arg = 12
  1027. X;wins_arg = 16
  1028. X`09subl3`09#1, @player_arg(ap), r1`09`09; get player # (0-snake)
  1029. X`09movl`09score`5Br1`5D, @score_arg(ap)`09; return score
  1030. X`09movl`09n_games`5Br1`5D, @games_arg(ap)`09; return # of games played
  1031. X`09movl`09wins`5Br1`5D, @wins_arg(ap)`09`09; return # of wins
  1032. X`09ret
  1033. X
  1034. X`09.entry`09-
  1035. Xsnake_game_count, `5Em<>
  1036. X;+
  1037. X;`09CALL SNAKE_GAME_COUNT( # games )
  1038. X;`09returns # of games played (total)
  1039. X;-
  1040. X`09movl`09game_count, @4(ap)
  1041. X`09ret
  1042. X
  1043. X`09.end
  1044. $ CALL UNPACK TANKM.MAR;2 1795618311
  1045. $ v=f$verify(v)
  1046. $ EXIT
  1047.